package dame;

public class SingleList implements IList{
    static  class ListNode{
        public int val;
        public ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode head;
    @Override
    public void addFirst(int data) {    //头插法
        ListNode node = new ListNode(data);
        node.next = head;
        head = node;
    }

    @Override
    public void addLast(int data) {       //尾插法
        ListNode node = new ListNode(data);
        if (head==null){
            head  = node;
            return;
        }
        ListNode cur  =head;
        while (cur.next != null){
            cur  =cur.next;
        }
        cur.next = node;
    }
    public void Llist(int index) throws Iempty{
        int len  = size();
        if (index<0||index>len){
            throw new Iempty("index位置不合法");
        }
    }
    @Override
    public void addIndex(int index, int data) {
        try {
            Llist(index);
        }catch (Iempty e){
            System.out.println("index位置不合法");
            e.printStackTrace();
        }
        if (index ==0){  //头
            addFirst(data);
        }
        if (index == size()){   //尾巴
            addLast(data);
        }
        ListNode cur  =head;
        while (index-1!=0){
            cur  = cur.next;
            index--;
        }
        ListNode node = new ListNode(data);
        node.next  = cur.next;
        cur.next = node;
    }


    @Override
    public boolean contains(int key) {
        ListNode cur = head;
        while (cur!=null){
            if (cur.val == key){
                return true;
            }
            cur = cur.next;
        }
        return false;
    }
    private ListNode FindListNodeKey(int key){
        ListNode cur  =  head;
        while (cur.next !=null){
            if (cur.next.val ==key){
                return cur;
            }
            cur = cur.next;
        }
        return cur;
    }

    @Override
    public void remove(int key) {
        if (head ==null){
            return;
        }
        if (head.val == key){
            head =head.next;
            return;
        }
        ListNode cur = FindListNodeKey(key);
        if (cur ==null) return;
        cur.next = cur.next.next;
    }

    @Override
    public void removeAllKey(int key) {
        if (head ==null) return;
        ListNode prev = head;
        ListNode cur  =head.next;
        while (cur!=null){
            if (cur.val==key){
              prev.next =cur.next;
              cur = cur.next;
            }else {
                prev =cur;
                cur = cur.next;
            }
        }
        if (head.val == key){
            head  = head.next;
        }
    }

    @Override
    public int size() {  //求链表长度
        int len  =0;
        ListNode cur = head;
        while (cur!=null){
            len++;
            cur = cur.next;
        }
        return len;
    }

    @Override
    public void clear() {  //清空链表
        ListNode cur = head;
        while (cur !=null){
            ListNode curN = cur.next;
            cur.next = null;
            cur = curN;
        }
        head = null;
    }

    @Override
    public void display() {  //打印链表
        ListNode cur = head;
        while (cur!=null){
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    }
}
